package com.da.springtest.autowired;

import com.da.springtest.autowired.test1.MainConfig1;
import com.da.springtest.autowired.test2.MainConfig2;
import com.da.springtest.autowired.test3.MainConfig3;
import com.da.springtest.autowired.test4.MainConfig4;
import com.da.springtest.autowired.test5.MainConfig5;
import com.da.springtest.autowired.test8.MainConfig8;
import com.da.springtest.autowired.test8.OrderService;
import com.da.springtest.autowired.test8.UserService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * @author chenlida
 * @date 2020/6/23 16:14
 *
 * Autowired查找：按类型找->通过限定符@Qualifier过滤->@Primary->@Priority->根据名称找（字段名称或者方法名称）
 *
 * Resource查找：先按Resource的name值作为bean名称找->按名称（字段名称、方法名称、set属性名称）找->按类型找->
 * 通过限定符@Qualifier过滤->@Primary->@Priority->根据名称找（字段名称或者方法参数名称）
 *
 * 1.需要掌握@Autowired注解和@Resource注解中候选者查找的过程
 * 2.@Autowired：先通过类型找，然后通过名称找
 * 3.@Resource：先通过名称找，然后通过类型找
 * 4.@Autowired和@Resource，建议开发中使用@Autowired来实现依赖注入，spring的注解用起来更名正言顺一些
 * 5.@Qulifier：限定符，可以用在类上；也可以用在依赖注入的地方，可以对候选者的查找进行过滤
 * 6.@Primary：多个候选者的时候，可以标注某个候选者为主要的候选者
 * 7.@Bean中注入依赖的3种方式需要掌握
 */
public class TestMethod {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context1 = new AnnotationConfigApplicationContext(MainConfig1.class);
        show(context1);
        System.out.println("------------------------------");
        AnnotationConfigApplicationContext context2 = new AnnotationConfigApplicationContext(MainConfig2.class);
        show(context2);
        System.out.println("------------------------------");
        AnnotationConfigApplicationContext context3 = new AnnotationConfigApplicationContext(MainConfig3.class);
        show(context3);
        System.out.println("------------------------------");
        AnnotationConfigApplicationContext context4 = new AnnotationConfigApplicationContext(MainConfig4.class);
        show(context4);
        System.out.println("------------------------------");
        AnnotationConfigApplicationContext context5 = new AnnotationConfigApplicationContext(MainConfig5.class);
        show(context5);
        System.out.println("------------------------------");
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig8.class);
        System.out.println(context.getBean(UserService.class).getDao());
        System.out.println(context.getBean(OrderService.class).getDao());
    }

    private static void show(AnnotationConfigApplicationContext context) {
        for (String beanName : context.getBeanDefinitionNames()) {
            System.out.println(beanName + "->" + context.getBean(beanName));
        }
    }
}
